/******************************************************************************* 
  Copyright (C), 1988-2020, zeno Tech. Co., Ltd.
  Description:     GPIO模块,统一管理芯片GPIO资源
  Function List: 
             GPIO_Get()
                |
                |
               \ /  
            GPIO_SetDir()
                |
                |
               \ /     
GPIO_SetLevel()/GPIO_GetLevel()/GPIO_SetBankLevel()
                |
                |
               \ / 
            GPIO_Put() 
               
*******************************************************************************/
#ifndef GPIO_H 
#define GPIO_H

#ifdef __cplusplus
extern "C" {
#endif

/*=============================================================================
                                 Includes                                  
==============================================================================*/


/*=============================================================================
                               Macro Definition
==============================================================================*/
#define GPIO_INVALID_INDEX      (~0)      /* 无效引脚号 */

                        
/*=============================================================================
                        Local Structures and Typedef 
==============================================================================*/
/* 中断触发方式 */
typedef enum
{
    GPIO_INT_HIGHLEVEL = 0x01,     /* 高电平触发 */
    GPIO_INT_LOWLEVEL  = 0x02,     /* 低电平触发 */
    GPIO_INT_RISING    = 0x04,     /* 上升沿触发 */
    GPIO_INT_FALLING   = 0x08,     /* 下降沿触发 */
}GPIO_intMode_t;


typedef struct
{
    unsigned int mode; 			       /* 中断触发模式掩码，定义见GPIO_intMode_t */
    int (*GPIO_Isr)(void *pIsrParam);  /* 中断处理函数 */
    void *pIsrParam;				   /* 中断处理函数入参 */
}GPIO_intRegister_t;


typedef struct
{
    unsigned int gpio;		/* gpio编号 */
    unsigned int level;		/* gpio电平 0：低电平 1：高电平 */
}GPIO_bankCtl_t;


/*=============================================================================
                             extern  Variables                                  
==============================================================================*/


/*=============================================================================
                             Function Definition                                  
==============================================================================*/ 

/*******************************************************************************
  Function:     GPIO_Get
  Description:  获取gpio资源
  Input:        - gpio: gpio编号, 1、2字节表示gpio号, 3、4字节表示mode
  Output:       无
  Return:       0: 成功
                PINMUX_INVALID_INDEX: 失败
  Others:       无
*******************************************************************************/
int GPIO_Get(unsigned int gpio);


/*******************************************************************************
  Function:     GPIO_Put
  Description:  释放gpio资源
  Input:        - gpio: gpio编号, 1、2字节表示gpio号, 3、4字节表示mode
  Output:       无
  Return:       0: 成功
                PINMUX_INVALID_INDEX: 失败
  Others:       无
*******************************************************************************/
int GPIO_Put(unsigned int gpio);


/*******************************************************************************
  Function:     GPIO_SetDir
  Description:  设置GPIO方向
  Input:        - gpio: gpio编号, 1、2字节表示gpio号, 3、4字节表示mode
                - dir: 0: 输入 1: 输出
  Output:       无
  Return:       0: 成功
                PINMUX_INVALID_INDEX: 失败
  Others:       无
*******************************************************************************/
int GPIO_SetDir(unsigned int gpio, unsigned int dir);


/*******************************************************************************
  Function:     GPIO_SetLevel
  Description:  配置gpio电平
  Input:        - gpio: gpio编号, 1、2字节表示gpio号, 3、4字节表示mode
                - level: 0: 低电平 1: 高电平
  Output:       无
  Return:       0: 成功
                PINMUX_INVALID_INDEX: 失败
  Others:       无
*******************************************************************************/
int GPIO_SetLevel(unsigned int gpio, unsigned int level);


/*******************************************************************************
  Function:     GPIO_SetBankLevel
  Description:  配置同一bank的gpio电平
  Input:        - pBankCtlArray: gpio数组
                - num: gpio个数
  Output:       无
  Return:       0: 成功
                ~0: 失败
  Others:       无
*******************************************************************************/
int GPIO_SetBankLevel(GPIO_bankCtl_t *pBankCtlArray, unsigned int num);


/*******************************************************************************
  Function:     GPIO_GetLevel
  Description:  获取gpio电平
  Input:        - gpio: gpio编号, 1、2字节表示gpio号, 3、4字节表示mode
  Output:       - pLevel: 0: 低电平 1: 高电平
  Return:       0: 成功
                PINMUX_INVALID_INDEX: 失败
  Others:       无
*******************************************************************************/
int GPIO_GetLevel(unsigned int gpio, unsigned int *pLevel);

#ifdef __KERNEL__  

/*******************************************************************************
  Function:     GPIO_EnableInt
  Description:  使能gpio中断
  Input:        - gpio: gpio编号, 1、2字节表示gpio号, 3、4字节表示mode
  Output:       
  Return:       0: 成功
                <0: 失败
  Others:       无
*******************************************************************************/
int GPIO_EnableInt(unsigned int gpio);

/*******************************************************************************
  Function:     GPIO_RegisterInt
  Description:  注册gpio中断
  Input:        - gpio: gpio编号, 1、2字节表示gpio号, 3、4字节表示mode
                - pParams: 注册参数 
  Output:       无
  Return:       0: 成功
                <0: 失败
  Others:       无
*******************************************************************************/
int GPIO_RegisterInt(unsigned int gpio, GPIO_intRegister_t *pParams);

/*******************************************************************************
  Function:     GPIO_UnregisterInt
  Description:  销毁gpio中断
  Input:        - gpio: gpio编号, 1、2字节表示gpio号, 3、4字节表示mode
  Output:       无
  Return:       0: 成功
                <0: 失败
  Others:       无
*******************************************************************************/
int GPIO_UnregisterInt(unsigned int gpio);  

#else

/*******************************************************************************
  Function:     GPIO_EnableInt
  Description:  使能gpio中断
  Input:        - gpio: gpio编号, 1、2字节表示gpio号, 3、4字节表示mode
                - mode: 中断触发模式掩码，定义见GPIO_intMode_t
  Output:       
  Return:       0: 成功
                <0: 失败
  Others:       无
*******************************************************************************/
int GPIO_EnableInt(unsigned int gpio, unsigned int mode);

/*******************************************************************************
  Function:     GPIO_ReadIrq
  Description:  获取gpio中断，该接口阻塞，需一直等待返回
  Input:        - gpio: gpio编号, 1、2字节表示gpio号, 3、4字节表示mode
  Output:       无
  Return:       0: 成功
                <0: 失败
  Others:       无
*******************************************************************************/
int GPIO_ReadIrq(unsigned int gpio);

#endif

/*******************************************************************************
  Function:     GPIO_DisableInt
  Description:  禁止gpio中断
  Input:        - gpio: gpio编号, 1、2字节表示gpio号, 3、4字节表示mode
  Output:       无
  Return:       0: 成功
                <0: 失败
  Others:       无
*******************************************************************************/
int GPIO_DisableInt(unsigned int gpio);

#ifdef __cplusplus
}
#endif

#endif // GPIO_H

